<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>雁过留声</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta property="og:type" content="website">
<meta property="og:title" content="雁过留声">
<meta property="og:url" content="http://yanglf007.gitee.io/blog/index.html">
<meta property="og:site_name" content="雁过留声">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="yanglf007">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/blog/atom.xml" title="雁过留声" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/blog/css/style.css">

<meta name="generator" content="Hexo 4.2.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/blog/" id="logo">雁过留声</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/blog/">Home</a>
        
          <a class="main-nav-link" href="/blog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/blog/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yanglf007.gitee.io/blog"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main">
  
    <article id="post-每日学习" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/10/25/%E6%AF%8F%E6%97%A5%E5%AD%A6%E4%B9%A0/" class="article-date">
  <time datetime="2020-10-25T15:57:28.734Z" itemprop="datePublished">2020-10-25</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/10/25/%E6%AF%8F%E6%97%A5%E5%AD%A6%E4%B9%A0/">每日学习</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>2020年10月25日23:57:34</p>
<p>1) arthas watch 观察异常<br>watch HelloService say ‘{throwExp}’ -e -x 3<br>2) arhas watch 观察某个实例属性<br>watch HelloService say ‘{target.username}’<br>3) hutool工具类 cr4加解密，base64加解密</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">SecureUtil.rc4(&quot;yanglf&quot;);</span><br><span class="line">Base64.encode(string);</span><br></pre></td></tr></table></figure>
<p>4)sentinel </p>
<p>2020年10月29日01:03:11</p>
<p>1）mvn 命令 批量修改版本号</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mvn versions:set -DnewVersion=<span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">mvn versions:revert</span><br></pre></td></tr></table></figure>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/10/25/%E6%AF%8F%E6%97%A5%E5%AD%A6%E4%B9%A0/" data-id="ckgtnonn6000pm8ul1bitcgxl" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-mybatis-plus" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/10/12/mybatis-plus/" class="article-date">
  <time datetime="2020-10-11T17:40:02.460Z" itemprop="datePublished">2020-10-12</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/10/12/mybatis-plus/">mybatis-plus</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>mybatis-plus条件<br><img src="../pic/mybatis-plus%E6%9D%A1%E4%BB%B6.jpg" alt="avatar"></p>
<p>遇到问题<br>1）给实体类上加表明 @TableName<br>2) 给不需要的字段上加  @TableField(exist = false)</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/10/12/mybatis-plus/" data-id="ckgtnonmy000dm8ulgzws0te7" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-秒杀系统" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/30/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F/" class="article-date">
  <time datetime="2020-08-30T12:22:35.995Z" itemprop="datePublished">2020-08-30</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/30/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F/">秒杀系统</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>秒杀系统需要考虑的问题</li>
</ol>
<p>高并发，缓存雪崩，缓存穿透，缓存击穿<br>超卖问题<br>恶意请求<br>链接暴露<br>热点数据<br>限流熔断降级</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/30/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F/" data-id="ckgtnonna000sm8uldeohe3fs" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-elasticsearch知识" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/29/elasticsearch%E7%9F%A5%E8%AF%86/" class="article-date">
  <time datetime="2020-08-28T16:00:44.503Z" itemprop="datePublished">2020-08-29</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/29/elasticsearch%E7%9F%A5%E8%AF%86/">elasticsearch知识</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>数据备份</li>
</ol>
<p>安装 elasticdump</p>
<p>数据导出<br>  elasticdump <br>  –input=<a href="http://192.168.0.104:9200/question" target="_blank" rel="noopener">http://192.168.0.104:9200/question</a> <br>  –output=/home/question_2020_08_28.json<br>数据导入<br>elasticdump <br>  –input=./alias.json <br>  –output=<a href="http://192.168.0.104:9200" target="_blank" rel="noopener">http://192.168.0.104:9200</a> <br>  –type=data</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/29/elasticsearch%E7%9F%A5%E8%AF%86/" data-id="ckgtnonlx0004m8ulex2sfeqa" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-redis面试" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/28/redis%E9%9D%A2%E8%AF%95/" class="article-date">
  <time datetime="2020-08-28T15:58:51.829Z" itemprop="datePublished">2020-08-28</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/28/redis%E9%9D%A2%E8%AF%95/">redis面试</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>哨兵模式</li>
</ol>
<p>哨兵模式是一种特殊的模式，首先Redis提供了哨兵的命令，哨兵是一个独立的进程，作为进程，它会独立运行。其原理是哨兵通过发送命令，<br>等待Redis服务器响应，从而监控运行的多个Redis实例</p>
<p>用文字描述一下故障切换（failover）的过程。假设主服务器宕机，哨兵1先检测到这个结果，<br>系统并不会马上进行failover过程，仅仅是哨兵1主观的认为主服务器不可用，这个现象成为主观下线。<br>当后面的哨兵也检测到主服务器不可用，并且数量达到一定值时，那么哨兵之间就会进行一次投票，<br>投票的结果由一个哨兵发起，进行failover操作。切换成功后，就会通过发布订阅模式，让各个哨兵把自己监控的从服务器实现切换主机，<br>这个过程称为客观下线。这样对于客户端而言，一切都是透明的</p>
<p>2,Redis 常见性能问题和解决方案？<br>主库避免开启数据备份，从库可以开启，每秒同步一次<br>主库和重库避免跨机房，在同一局域网内</p>
<ol start="3">
<li>redis主从复制<br>全量复制<br>一. 从服务器通过slaveof 找到主服务器的ip和端口,链接上主服务器<br>二. 从服务器向主服务器发送psync 命令,要求同步数据<br>三. 主服务器收到命令,使用bgsave,异步将内存中的数据写入到磁盘中,同时开启缓存,之后的写命令进入缓存区<br>四. 主服务器向从服务器发送rdb文件,从服务器接受文件,解析并载入内存<br>五. 发送缓冲期数据,从服务器刷新数据</li>
</ol>
<p>部分复制<br>如果因为网络抖动,主从服务器断开链接<br>主服务器 写命令进入复制缓存区<br>从服务器执行sync命令,带上run_id 和 off_set<br>主服务器查看off_set是否在缓存区范围之内,如果在,主服务器就会发送continue命令,从偏移量开始同步数据</p>
<p>offset 在主服务表示已经发送的位置<br>        在从服务器表示已经接受的位置,两个直接就是从服务器需要同步的数据</p>
<p>4.redis原理</p>
<ol start="5">
<li>redis选举</li>
</ol>
<p>redis cluster选举</p>
<ol>
<li><p>故障发现<br>从节点会和主节点周期性的ping/pang链接,单主节点没有回复pang时,从节点认为主节点发送故障,发送广播到其他主节点</p>
</li>
<li><p>故障确认<br>其他主节点会确认节点是否发送故障,如果足够的节点认为发送故障,则状态升级从pfail 到fail</p>
</li>
<li><p>slave选举<br>从节点从主节点接受数据包时会更新自己的epoche,epoche最新的从节点进行选举<br>从节点向其他主节点发送广播,要求选举自己为master,如果主节点没有参与选举过,则同意<br>从节点收到半数以上的同意就会发送广播,让其他节点更新信息,自己成功成为主节点</p>
</li>
<li><p>集群结果变更<br>当主节点恢复可用时,首先认为自己是主节点,通过广播会发现从节点已经替换自己后,会降级成从节点</p>
</li>
</ol>
<p>redis sentinel (哨兵模式选举)</p>
<ol>
<li><p>主观下线<br>哨兵每隔1s ping一次主节点,如果规定时间没有返回就任务是主观下线</p>
</li>
<li><p>客观下线<br>主观下线后,哨兵会询问其他哨兵,如果一定数量的(可配置)哨兵认为主观下线,那么主节点就会客观下线</p>
</li>
<li><p>哨兵选举leader<br>每个哨兵都可能成为leader,发现主节点下线的哨兵会请求其他哨兵,选举自己为主,只要超过半数就升级为leader(所以集群数量需要至少3)<br>leader处理故障转移</p>
</li>
</ol>
<p>4.leader 选举master<br>先过滤故障节点<br>一. 根据优先级从slave中选举主节点<br>二. 复制偏移量最大的<br>三. runId 最小的</p>
<p>redis 内部数据结构</p>
<p>dict  类似hashmap ,2个数组加链表 ,table[0] ,table[1]<br>rehash 的时候移动一部分<br>在增删改查的时候,如果判断在rehash,会推动rehash过程</p>
<p>table中存的是entry{</p>
<pre><code>key
value
next </code></pre><p>}<br>String 类型一般是sds类型<br>value 是robj</p>
<p>robj {<br>    type,<br>    encoding,<br>    lru,<br>    refcount,<br>    ptr 数据指针</p>
<p>}</p>
<p>redis处理命令的主要逻辑</p>
<p>redis服务器对命令的处理都是单线程的，但是I/O层面却面向多个客户端并发地提供服务，并发到内部单线程的转化通过多路复用框架来实现<br>首先从多路服用框架（epoll、evport、kqueue）中select出已经ready的文件描述符（fileDescriptor）<br>ready的标准是已有数据到达内核（kernel）、已准备好写入数据<br>对于上一步已经ready的fd，redis会分别对每个fd上已ready的事件进行处理，处理完相同fd上的所有事件后，再处理下一个ready的fd。有3中事件类型<br>acceptTcpHandler：连接请求事件<br>readQueryFromClient：客户端的请求命令事件<br>sendReplyToClient：将暂存的执行结果写回客户端</p>
<p>对来自客户端的命令执行结束后，接下来处理定时任务（TimeEvent）<br>aeApiPoll的等待时间取决于定时任务处理（TimeEvent）逻辑<br>本次主循环完毕，进入下一次主循环的beforeSleep逻辑，后者负责处理数据过期、增量持久化的文件写入等任务</p>
<p>基础的数据类型：sds、dict、intset、zipmap、adlist、quicklist、skiplist<br>举例：以key为hello，value为world，类型是string，它的内存使用：</p>
<p>Redis事务的三个阶段：</p>
<p>开始事务<br>命令入队<br>执行事务<br>Redis事务相关命令：</p>
<p>　　watch key1 key2 … : 监视一或多个key,如果在事务执行之前，被监视的key被其他命令改动，则事务被打断 （ 类似乐观锁 ）</p>
<p>　　multi : 标记一个事务块的开始（ queued ）</p>
<p>　　exec : 执行所有事务块的命令 （ 一旦执行exec后，之前加的监控锁都会被取消掉 ）　</p>
<p>　　discard : 取消事务，放弃事务块中的所有命令</p>
<p>　　unwatch : 取消watch对所有key的监控</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/28/redis%E9%9D%A2%E8%AF%95/" data-id="ckgtnonn2000jm8ul3bwveh5e" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-设计模式" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" class="article-date">
  <time datetime="2020-08-26T13:07:40.185Z" itemprop="datePublished">2020-08-26</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h3 id="设计模式"><a href="#设计模式" class="headerlink" title="设计模式"></a>设计模式</h3><ol>
<li>了解哪些设计模式，举例说明jdk源码用到了你说的设计模式</li>
</ol>
<h4 id="单例模式"><a href="#单例模式" class="headerlink" title="单例模式"></a>单例模式</h4><p>懒汉模式<br>private static Singleton instance = null;<br>getInstance 什么时候用什么时候实例化</p>
<h4 id="饿汉模式"><a href="#饿汉模式" class="headerlink" title="饿汉模式"></a>饿汉模式</h4><p>private static Singleton instance = new Singleton();<br>类加载的时候就进行实例化</p>
<h4 id="双重锁校验"><a href="#双重锁校验" class="headerlink" title="双重锁校验"></a>双重锁校验</h4><p>在懒汉模式基础上</p>
<p>jkd使用举例 ：java.lang.RunTime 使用的是饿汉模式</p>
<h4 id="工厂模式"><a href="#工厂模式" class="headerlink" title="工厂模式"></a>工厂模式</h4><p>主要是用来创建对象，不用每次都new一个对象,解耦创建对象过程</p>
<p>举例说明：实现FactoryBean的</p>
<h4 id="代理模式-aop动态代理"><a href="#代理模式-aop动态代理" class="headerlink" title="代理模式 aop动态代理"></a>代理模式 aop动态代理</h4><p>jdk的动态代理,proxy,<br>使用动态代理需要实现 InvocationHandler,创建代理对象的时候用<br> Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);<br>举例：MapperProxyFactory</p>
<h4 id="模板模式"><a href="#模板模式" class="headerlink" title="模板模式"></a>模板模式</h4><p>aqs中实现</p>
<p>aqs有两种node节点模型，SHARED和EXCLUSIVE</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">public final void acquire(int arg) &#123;</span><br><span class="line">    if (!tryAcquire(arg) &amp;&amp;</span><br><span class="line">        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))</span><br><span class="line">        selfInterrupt();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<h4 id="建造者模式-发布订阅模式"><a href="#建造者模式-发布订阅模式" class="headerlink" title="建造者模式-发布订阅模式"></a>建造者模式-发布订阅模式</h4><h4 id="策略模式（strategy）dubbo-spi机制就是策略模式-一种接口多种实现-可以自定义选择某一种策略的实现"><a href="#策略模式（strategy）dubbo-spi机制就是策略模式-一种接口多种实现-可以自定义选择某一种策略的实现" class="headerlink" title="策略模式（strategy）dubbo spi机制就是策略模式,一种接口多种实现,可以自定义选择某一种策略的实现"></a>策略模式（strategy）dubbo spi机制就是策略模式,一种接口多种实现,可以自定义选择某一种策略的实现</h4><h4 id="适配器模式-可以将接口转换成期望的另一个接口，使得那些接口不兼容的类可以一起工作，别名又为包装器-Wrapper"><a href="#适配器模式-可以将接口转换成期望的另一个接口，使得那些接口不兼容的类可以一起工作，别名又为包装器-Wrapper" class="headerlink" title="适配器模式 可以将接口转换成期望的另一个接口，使得那些接口不兼容的类可以一起工作，别名又为包装器 ( Wrapper )"></a>适配器模式 可以将接口转换成期望的另一个接口，使得那些接口不兼容的类可以一起工作，别名又为包装器 ( Wrapper )</h4><h4 id="原型模式（prototype）是指原型实例指定创建对象的种类，并且通过复制这些原型创建新的对象。原型模式主要适用于以下："><a href="#原型模式（prototype）是指原型实例指定创建对象的种类，并且通过复制这些原型创建新的对象。原型模式主要适用于以下：" class="headerlink" title="原型模式（prototype）是指原型实例指定创建对象的种类，并且通过复制这些原型创建新的对象。原型模式主要适用于以下："></a>原型模式（prototype）是指原型实例指定创建对象的种类，并且通过复制这些原型创建新的对象。原型模式主要适用于以下：</h4><p>　　（1）类初始化消耗资源较多；<br>　　（2）使用new 生成一个对象需要非常繁琐的过程（数据准备访问权限等）;<br>　　（3）构造函数比较复杂；<br>　　（4）在循环体中产生大量对象；<br>    在spring中用到的原型模式有：scope=”prototype” ，还有常用的JSON.parseObject()也是一种原型模式</p>
<h4 id="桥接模式（birdge）"><a href="#桥接模式（birdge）" class="headerlink" title="桥接模式（birdge）"></a>桥接模式（birdge）</h4><h4 id="状态模式（state）"><a href="#状态模式（state）" class="headerlink" title="状态模式（state）"></a>状态模式（state）</h4><h4 id="外观模式（Facade）隐藏实现细节-向访问者提供一个简洁的接口"><a href="#外观模式（Facade）隐藏实现细节-向访问者提供一个简洁的接口" class="headerlink" title="外观模式（Facade）隐藏实现细节,向访问者提供一个简洁的接口"></a>外观模式（Facade）隐藏实现细节,向访问者提供一个简洁的接口</h4><h4 id="职责链模式（chain-of-responsiblity）有多个对象共同对一个任务进行处理-典型的是拦截器-多个拦截器都会对请求进行拦截"><a href="#职责链模式（chain-of-responsiblity）有多个对象共同对一个任务进行处理-典型的是拦截器-多个拦截器都会对请求进行拦截" class="headerlink" title="职责链模式（chain of responsiblity）有多个对象共同对一个任务进行处理,典型的是拦截器,多个拦截器都会对请求进行拦截"></a>职责链模式（chain of responsiblity）有多个对象共同对一个任务进行处理,典型的是拦截器,多个拦截器都会对请求进行拦截</h4>
      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" data-id="ckgtnonnc000wm8ul6wxw2j88" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-前言技术" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/26/%E5%89%8D%E8%A8%80%E6%8A%80%E6%9C%AF/" class="article-date">
  <time datetime="2020-08-25T16:04:56.375Z" itemprop="datePublished">2020-08-26</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/26/%E5%89%8D%E8%A8%80%E6%8A%80%E6%9C%AF/">前言技术</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>redis6.0</li>
</ol>
<p><a href="https://zhuanlan.zhihu.com/p/139079822" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/139079822</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/26/%E5%89%8D%E8%A8%80%E6%8A%80%E6%9C%AF/" data-id="ckgtnonn3000lm8ul73gg9ksd" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-多线程" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/25/%E5%A4%9A%E7%BA%BF%E7%A8%8B/" class="article-date">
  <time datetime="2020-08-25T15:39:49.846Z" itemprop="datePublished">2020-08-25</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/25/%E5%A4%9A%E7%BA%BF%E7%A8%8B/">多线程</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>线程池如果允许时动态修改核心线程数会发生什么<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ThreadPoolExecutor threadPoolExecutor = <span class="keyword">new</span> ThreadPoolExecutor(<span class="number">4</span>, <span class="number">10</span>,</span><br><span class="line">                <span class="number">0L</span>, TimeUnit.MILLISECONDS,</span><br><span class="line">                <span class="keyword">new</span> LinkedBlockingQueue&lt;Runnable&gt;());</span><br><span class="line">        threadPoolExecutor.setCorePoolSize(<span class="number">6</span>);</span><br></pre></td></tr></table></figure>
可以自定义线程池<br>修改线程池核心线程参数</li>
</ol>
<p>如果当前线程数大于设置的核心线程数，会要求中断<br>如果当前线程数小于新的线程数，开启新线程执行队列中的任务，开启的线程数为核心线程数差值和队列中等待的任务最小值</p>
<p>2.Thread 中wait和sleep的区别<br>相同点：</p>
<p>　　1.wait和sleep方法都可以使线程进入阻塞状态</p>
<p>　　2.wait和sleep方法均是可中断方法，被中断后都会受到中断异常<br>不同点：<br>　　1.所属类不同：wait是Object的方法，而sleep是Thead特有的方法</p>
<p>　　2.关于锁的释放：wait 会释放锁，sleep 睡觉了，抱着锁睡觉，不会释放！</p>
<p>　　3.使用位置不同：wait方法的执行必须在同步代码块中进行，而sleep则可以在任何位置　　</p>
<p>　　4.sleep方法短暂休眠之后会主动退出阻塞，而wait方法（没有指定等待的时间）则需要被其他线程中断后才能退出阻塞</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/25/%E5%A4%9A%E7%BA%BF%E7%A8%8B/" data-id="ckgtnonn6000om8ulevunhnq9" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-算法" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/20/%E7%AE%97%E6%B3%95/" class="article-date">
  <time datetime="2020-08-19T16:36:25.383Z" itemprop="datePublished">2020-08-20</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/20/%E7%AE%97%E6%B3%95/">算法</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>lru算法：最近最少使用算法，淘汰的是最近没有被使用过的算法<br>lfu算法：最不经常使用算法，淘汰一定时间内使用频率最低的算法</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line">        List&lt;String&gt; codeList = <span class="keyword">new</span> ArrayList&lt;String&gt;();</span><br><span class="line">        codeList.add(<span class="string">"UTF-8"</span>);</span><br><span class="line">        codeList.add(<span class="string">"latin1"</span>);</span><br><span class="line">        codeList.add(<span class="string">"GBK"</span>);</span><br><span class="line">        codeList.add(<span class="string">"GB2312"</span>);</span><br><span class="line">        codeList.add(<span class="string">"ISO-8859-1"</span>);</span><br><span class="line">        codeList.add(<span class="string">"unicode"</span>);</span><br><span class="line"></span><br><span class="line">        String commonChiness = <span class="string">"二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐句匆册犯外处冬鸟务包饥主市立闪兰半汁汇头汉宁穴它讨写让礼训必议讯记永司尼民出辽奶奴加召皮边发孕圣对台矛纠母幼丝式刑动扛寺吉扣考托老执巩圾扩扫地扬场耳共芒亚芝朽朴机权过臣再协西压厌在有百存而页匠夸夺灰达列死成夹轨邪划迈毕至此贞师尘尖劣光当早吐吓虫曲团同吊吃因吸吗屿帆岁回岂刚则肉网年朱先丢舌竹迁乔伟传乒乓休伍伏优伐延件任伤价份华仰仿伙伪自血向似后行舟全会杀合兆企众爷伞创肌朵杂危旬旨负各名多争色壮冲冰庄庆亦刘齐交次衣产决充妄闭问闯羊并关米灯州汗污江池汤忙兴宇守宅字安讲军许论农讽设访寻那迅尽导异孙阵阳收阶阴防奸如妇好她妈戏羽观欢买红纤级约纪驰巡寿弄麦形进戒吞远违运扶抚坛技坏扰拒找批扯址走抄坝贡攻赤折抓扮抢孝均抛投坟抗坑坊抖护壳志扭块声把报却劫芽花芹芬苍芳严芦劳克苏杆杠杜材村杏极李杨求更束豆两丽医辰励否还歼来连步坚旱盯呈时吴助县里呆园旷围呀吨足邮男困吵串员听吩吹呜吧吼别岗帐财针钉告我乱利秃秀私每兵估体何但伸作伯伶佣低你住位伴身皂佛近彻役返余希坐谷妥含邻岔肝肚肠龟免狂犹角删条卵岛迎饭饮系言冻状亩况床库疗应冷这序辛弃冶忘闲间闷判灶灿弟汪沙汽沃泛沟没沈沉怀忧快完宋宏牢究穷灾良证启评补初社识诉诊词译君灵即层尿尾迟局改张忌际陆阿陈阻附妙妖妨努忍劲鸡驱纯纱纳纲驳纵纷纸纹纺驴纽奉玩环武青责现表规抹拢拔拣担坦押抽拐拖拍者顶拆拥抵拘势抱垃拉拦拌幸招坡披拨择抬其取苦若茂苹苗英范直茄茎茅林枝杯柜析板松枪构杰述枕丧或画卧事刺枣雨卖矿码厕奔奇奋态欧垄妻轰顷转斩轮软到非叔肯齿些虎虏肾贤尚旺具果味昆国昌畅明易昂典固忠咐呼鸣咏呢岸岩帖罗帜岭凯败贩购图钓制知垂牧物乖刮秆和季委佳侍供使例版侄侦侧凭侨佩货依的迫质欣征往爬彼径所舍金命斧爸采受乳贪念贫肤肺肢肿胀朋股肥服胁周昏鱼兔狐忽狗备饰饱饲变京享店夜庙府底剂郊废净盲放刻育闸闹郑券卷单炒炊炕炎炉沫浅法泄河沾泪油泊沿泡注泻泳泥沸波泼泽治怖性怕怜怪学宝宗定宜审宙官空帘实试郎诗肩房诚衬衫视话诞询该详建肃录隶居届刷屈弦承孟孤陕降限妹姑姐姓始驾参艰线练组细驶织终驻驼绍经贯奏春帮珍玻毒型挂封持项垮挎城挠政赴赵挡挺括拴拾挑指垫挣挤拼挖按挥挪某甚革荐巷带草茧茶荒茫荡荣故胡南药标枯柄栋相查柏柳柱柿栏树要咸威歪研砖厘厚砌砍面耐耍牵残殃轻鸦皆背战点临览竖省削尝是盼眨哄显哑冒映星昨畏趴胃贵界虹虾蚁思蚂虽品咽骂哗咱响哈咬咳哪炭峡罚贱贴骨钞钟钢钥钩卸缸拜看矩怎牲选适秒香种秋科重复竿段便俩贷顺修保促侮俭俗俘信皇泉鬼侵追俊盾待律很须叙剑逃食盆胆胜胞胖脉勉狭狮独狡狱狠贸怨急饶蚀饺饼弯将奖哀亭亮度迹庭疮疯疫疤姿亲音帝施闻阀阁差养美姜叛送类迷前首逆总炼炸炮烂剃洁洪洒浇浊洞测洗活派洽染济洋洲浑浓津恒恢恰恼恨举觉宣室宫宪突穿窃客冠语扁袄祖神祝误诱说诵垦退既屋昼费陡眉孩除险院娃姥姨姻娇怒架贺盈勇怠柔垒绑绒结绕骄绘给络骆绝绞统耕耗艳泰珠班素蚕顽盏匪捞栽捕振载赶起盐捎捏埋捉捆捐损都哲逝捡换挽热恐壶挨耻耽恭莲莫荷获晋恶真框桂档桐株桥桃格校核样根索哥速逗栗配翅辱唇夏础破原套逐烈殊顾轿较顿毙致柴桌虑监紧党晒眠晓鸭晃晌晕蚊哨哭恩唤啊唉罢峰圆贼贿钱钳钻铁铃铅缺氧特牺造乘敌秤租积秧秩称秘透笔笑笋债借值倚倾倒倘俱倡候俯倍倦健臭射躬息徒徐舰舱般航途拿爹爱颂翁脆脂胸胳脏胶脑狸狼逢留皱饿恋桨浆衰高席准座脊症病疾疼疲效离唐资凉站剖竞部旁旅畜阅羞瓶拳粉料益兼烤烘烦烧烛烟递涛浙涝酒涉消浩海涂浴浮流润浪浸涨烫涌悟悄悔悦害宽家宵宴宾窄容宰案请朗诸读扇袜袖袍被祥课谁调冤谅谈谊剥恳展剧屑弱陵陶陷陪娱娘通能难预桑绢绣验继球理捧堵描域掩捷排掉堆推掀授教掏掠培接控探据掘职基著勒黄萌萝菌菜萄菊萍菠营械梦梢梅检梳梯桶救副票戚爽聋袭盛雪辅辆虚雀堂常匙晨睁眯眼悬野啦晚啄距跃略蛇累唱患唯崖崭崇圈铜铲银甜梨犁移笨笼笛符第敏做袋悠偿偶偷您售停偏假得衔盘船斜盒鸽悉欲彩领脚脖脸脱象够猜猪猎猫猛馅馆凑减毫麻痒痕廊康庸鹿盗章竟商族旋望率着盖粘粗粒断剪兽清添淋淹渠渐混渔淘液淡深婆梁渗情惜惭悼惧惕惊惨惯寇寄宿窑密谋谎祸谜逮敢屠弹随蛋隆隐婚婶颈绩绪续骑绳维绵绸绿琴斑替款堪搭塔越趁趋超提堤博揭喜插揪搜煮援裁搁搂搅握揉斯期欺联散惹葬葛董葡敬葱落朝辜葵棒棋植森椅椒棵棍棉棚棕惠惑逼厨厦硬确雁殖裂雄暂雅辈悲紫辉敞赏掌晴暑最量喷晶喇遇喊景践跌跑遗蛙蛛蜓喝喂喘喉幅帽赌赔黑铸铺链销锁锄锅锈锋锐短智毯鹅剩稍程稀税筐等筑策筛筒答筋筝傲傅牌堡集焦傍储奥街惩御循艇舒番释禽腊脾腔鲁猾猴然馋装蛮就痛童阔善羡普粪尊道曾焰港湖渣湿温渴滑湾渡游滋溉愤慌惰愧愉慨割寒富窜窝窗遍裕裤裙谢谣谦属屡强粥疏隔隙絮嫂登缎缓编骗缘瑞魂肆摄摸填搏塌鼓摆携搬摇搞塘摊蒜勤鹊蓝墓幕蓬蓄蒙蒸献禁楚想槐榆楼概赖酬感碍碑碎碰碗碌雷零雾雹输督龄鉴睛睡睬鄙愚暖盟歇暗照跨跳跪路跟遣蛾蜂嗓置罪罩错锡锣锤锦键锯矮辞稠愁筹签简毁舅鼠催傻像躲微愈遥腰腥腹腾腿触解酱痰廉新韵意粮数煎塑慈煤煌满漠源滤滥滔溪溜滚滨粱滩慎誉塞谨福群殿辟障嫌嫁叠缝缠静碧璃墙撇嘉摧截誓境摘摔聚蔽慕暮蔑模榴榜榨歌遭酷酿酸磁愿需弊裳颗嗽蜻蜡蝇蜘赚锹锻舞稳算箩管僚鼻魄貌膜膊膀鲜疑馒裹敲豪膏遮腐瘦辣竭端旗精歉熄熔漆漂漫滴演漏慢寨赛察蜜谱嫩翠熊凳骡缩慧撕撒趣趟撑播撞撤增聪鞋蕉蔬横槽樱橡飘醋醉震霉瞒题暴瞎影踢踏踩踪蝶蝴嘱墨镇靠稻黎稿稼箱箭篇僵躺僻德艘膝膛熟摩颜毅糊遵潜潮懂额慰劈操燕薯薪薄颠橘整融醒餐嘴蹄器赠默镜赞篮邀衡膨雕磨凝辨辩糖糕燃澡激懒壁避缴戴擦鞠藏霜霞瞧蹈螺穗繁辫赢糟糠燥臂翼骤鞭覆蹦镰翻鹰警攀蹲颤瓣爆疆壤耀躁嚼嚷籍魔灌蠢霸露囊罐"</span>;</span><br><span class="line">        <span class="keyword">for</span> (String s : codeList) &#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (String s1 : codeList) &#123;</span><br><span class="line">                <span class="keyword">if</span> (s.equals(s1))&#123;</span><br><span class="line">                    <span class="keyword">continue</span>;</span><br><span class="line">                &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">                    String str = <span class="string">"&amp;#36825;&amp;#26159;&amp;#19968;&amp;#20010;&amp;#20363;&amp;#23376;&amp;#44;&amp;#116;&amp;#104;&amp;#105;&amp;#115;&amp;#32;&amp;#105;&amp;#115;&amp;#32;&amp;#97;&amp;#32;&amp;#101;&amp;#120;&amp;#97;&amp;#109;&amp;#112;&amp;#108;"</span>;</span><br><span class="line">                    String result = <span class="keyword">new</span> String(str.getBytes(s), s1);</span><br><span class="line"><span class="comment">//                    if (result.contains("???????")|| result.contains("������")||result.contains("꣧")||result.contains("㼿")||result.contains("ュ"))&#123;</span></span><br><span class="line"><span class="comment">//                        System.out.println(result.contains("겅")||result.contains("︾"));</span></span><br><span class="line"><span class="comment">//                        continue;</span></span><br><span class="line"><span class="comment">//                    &#125;</span></span><br><span class="line">                    <span class="keyword">int</span> length = result.length();</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">int</span> i= <span class="number">0</span>;i&lt;length;i++)&#123;</span><br><span class="line">                        <span class="keyword">char</span> c = result.charAt(i);</span><br><span class="line">                        <span class="keyword">if</span> (commonChiness.contains(c+<span class="string">""</span>))&#123;</span><br><span class="line">                            System.out.println(s+<span class="string">"==&gt;"</span>+s1);</span><br><span class="line">                            System.out.println(result);</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line"></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure>
      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/20/%E7%AE%97%E6%B3%95/" data-id="ckgtnonom0010m8uldpm9d5ut" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-io" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/13/io/" class="article-date">
  <time datetime="2020-08-13T15:35:00.190Z" itemprop="datePublished">2020-08-13</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/blog/2020/08/13/io/">io</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>直接缓存区和非直接缓存区<br>非直接缓冲区是需要经过一个：copy的阶段的(从内核空间copy到用户空间)<br>直接缓冲区不需要经过copy阶段，也可以理解成—&gt;内存映射文件，(上面的图片也有过例子)。</li>
</ol>
<p>缓冲区创建的时候分配的是直接缓冲区</p>
<p>分散读取(scatter)：将一个通道中的数据分散读取到多个缓冲区中<br>聚集写入(gather)：将多个缓冲区中的数据集中写入到一个通道中</p>
<ol start="2">
<li>I/O模型</li>
</ol>
<p>阻塞<br>非阻塞<br>io多路复用<br>信号驱动io<br>异步io</p>
<ol start="3">
<li><p>文件描述符 fd<br>Linux 的内核将所有外部设备都看做一个文件来操作，对一个文件的读写操作会调用内核提供的系统命令(api)，<br>返回一个file descriptor（fd，文件描述符）。而对一个socket的读写也会有响应的描述符，称为socket fd（socket文件描述符），<br>描述符就是一个数字，指向内核中的一个结构体（文件路径，数据区等一些属性）。</p>
</li>
<li><p>Selector多路复用选择器<br>一个线程能够管理多个Channel的状态</p>
</li>
</ol>
<p>reactor模型<br><a href="https://blog.csdn.net/qq924862077/article/details/81026740" target="_blank" rel="noopener">https://blog.csdn.net/qq924862077/article/details/81026740</a></p>
<p>nio空轮训问题<br>正常情况下，selector.select()操作是阻塞的，只有被监听的到有读写操作时，才被唤醒<br>但是，在这个bug中，没有任何有读写请求，但是select()操作依旧被唤醒<br>很显然，这种情况下，selectedKeys()返回的是个空数组<br>然后按照逻辑执行到while(true)处，循环执行，导致死循环。</p>
<p>io多路复用原理<br>如何避免同步非阻塞NIO模型中轮询等待的问题呢？这就是IO多路复用模型。<br>IO多路复用模型，就是通过一种新的系统调用，一个进程可以监视多个文件描述符，一旦某个描述符就绪（一般是内核缓冲区可读/可写），<br>内核kernel能够通知程序进行相应的IO系统调用。<br>目前支持IO多路复用的系统调用，有 select，epoll等等。<br>select系统调用，是目前几乎在所有的操作系统上都有支持，具有良好跨平台特性。epoll是在linux 2.6内核中提出的，<br>是select系统调用的linux增强版本。<br>IO多路复用模型的基本原理就是select/epoll系统调用，单个线程不断的轮询select/epoll系统调用所负责的成百上千的socket连接，<br>当某个或者某些socket网络连接有数据到达了，就返回这些可以读写的连接。因此，好处也就显而易见了——通过一次select/epoll系统调用，<br>就查询到到可以读写的一个甚至是成百上千的网络连接。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/13/io/" data-id="ckgtnonmw000bm8ulbek3ezah" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  


  <nav id="page-nav">
    
    <span class="page-number current">1</span><a class="page-number" href="/blog/page/2/">2</a><a class="page-number" href="/blog/page/3/">3</a><a class="page-number" href="/blog/page/4/">4</a><a class="extend next" rel="next" href="/blog/page/2/">Next &amp;raquo;</a>
  </nav>

</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/10/">October 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/08/">August 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/07/">July 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/06/">June 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/05/">May 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/04/">April 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/blog/2020/10/25/%E6%AF%8F%E6%97%A5%E5%AD%A6%E4%B9%A0/">每日学习</a>
          </li>
        
          <li>
            <a href="/blog/2020/10/12/mybatis-plus/">mybatis-plus</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/30/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F/">秒杀系统</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/29/elasticsearch%E7%9F%A5%E8%AF%86/">elasticsearch知识</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/28/redis%E9%9D%A2%E8%AF%95/">redis面试</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2020 yanglf007<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/blog/" class="mobile-nav-link">Home</a>
  
    <a href="/blog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/blog/fancybox/jquery.fancybox.css">

  
<script src="/blog/fancybox/jquery.fancybox.pack.js"></script>




<script src="/blog/js/script.js"></script>




  </div>
</body>
</html>